/*******************************************************************
//  FFT / IFFT
//   16-point FFT / IFFT
//      if (s == 0 ) IFFT
//      elseif ( s == 1) FFT 
//  Date : 04/11/2011
//  Jungmin Park
********************************************************************/

#include <math.h>
#include "FFT.h"

void FFT (int s, float *X_re, float *X_im, float *Y_re, float *Y_im)
{
	int i, j;
	float temp1 = 0;
	float temp2 = 0;
    for (i=0; i < 16; i++)
	{
		for (j=0; j < 16 ; j++)
		{
			if ( s == 0 )    // Inverse FFT
			{
			    temp1 += (*(X_re+j)*cosf(2*PI*i*j/16)-*(X_im+j)*sinf(2*PI*i*j/16));      //  Real value
		     	temp2 += (*(X_re+j)*sinf(2*PI*i*j/16)+*(X_im+j)*cosf(2*PI*i*j/16));      //  Imaginary value
			}
			else             // FFT
			{
			    temp1 += (*(X_re+j)*cosf(2*PI*i*j/16)+*(X_im+j)*sinf(2*PI*i*j/16));      //  Real value
		     	temp2 += (*(X_re+j)*-sinf(2*PI*i*j/16)+*(X_im+j)*cosf(2*PI*i*j/16));     //  Imaginary value 
			}

		}

		if ( s == 0 )
		{
			*(Y_re+i) = temp1/16;
		    *(Y_im+i) = temp2/16;
		}
		else 
		{
		    *(Y_re+i) = temp1;
		    *(Y_im+i) = temp2;
		}
		temp1 = 0;
		temp2 = 0;
	}
}